package lang;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author xiaoming
 * @version 1.0
 * @date 2018/11/28 7:59
 * Random类中实现的随机算法是伪随机，也就是有规则的随机。
 * 既然又伪随机, 然后就有一个
 *
 * 在进行随机时，随机算法的起源数字称为种子数(seed)，在种子数的基础上进行一定的变换，从而产生需要的随机数字。
 **/
public class LangRandom {
    public static void main(String[] args) {
        Random random = new Random();
        long seed = 24L;
        Random random1 = new Random(seed);
        Random random2 = new Random(seed);

        /*
        0. 获取随机数
         */

        System.out.println("0. 获取随机数: " +  random.nextInt() + " / " + random1.nextInt() );
        System.out.println(" 获取 [0,5) 的正整数: " + random.nextInt(5) + " / " + random1.nextInt(5));
        System.out.println(random.nextBoolean());

        /*
         1. 使用同一种子 同一顺序创建 将会得到相同的相同的随机数
          */

        System.out.println("1. 同一种子数获取相同随机数" +  random.nextInt() + " / " + random.nextInt() );
        System.out.println(random1.nextInt() + " / " + random2.nextInt() );

        testRandom();
        System.out.println("---------------------");
        testRandom();
        System.out.println("---------------------");
        testRandom();

        /*
         2. Random不是线程安全的, 所以util.concurrent并发包中的提供了一个线程安全的随机数
          */
        ThreadLocalRandom threadLocalRandom =  ThreadLocalRandom.current();
        System.out.println(threadLocalRandom.nextInt());

    }
    public static void testRandom(){
        Random random = new Random(1);
        for(int i=0; i<5; i++){
            System.out.print(random.nextInt()+"\t");
        }
        System.out.print( "ts:" + System.nanoTime());
        System.out.println("");
    }


}
